﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Joel.Vishnu.Presentacion.Vistas;
using Joel.Vishnu.Repositorios;
using Joel.Vishnu.Modelo.Entidades;
using Joel.Vishnu.Modelo.Enumeradores;

namespace Joel.Vishnu.Presentacion
{
    public class ProductosPresentador
    {
        #region Constructores

        public ProductosPresentador(IProductos vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        IProductos vista;

        #endregion

        #region Propiedades

        private RepositorioProducto RepositorioProducto
        {
            get { return new RepositorioProducto(); }
        }

        private RepositorioProductoSubCategoria RepositorioProductoSubCategoria
        {
            get { return new RepositorioProductoSubCategoria(); }
        }

        #endregion

        #region Metodos

        public void ActualizarProductoSubCategorias()
        {
            vista.ListaProductoSubCategoria = (from item in RepositorioProductoSubCategoria.DevolverTodos()
                                               orderby item.Nombre ascending
                                               select item).ToList();
        }

        public void ActualizarProductos()
        {
            vista.ListaProductos = (from item in RepositorioProducto.DevolverTodos()
                                    orderby item.Nombre ascending
                                    select item).ToList();
        }

        public void Inicialiar()
        {
            ActualizarProductoSubCategorias();
            ActualizarProductos();
        }

        public void Cancelar()
        {
            Inicialiar();
        }

        public void Aceptar()
        {
            if (vista.Nombre == String.Empty)
                throw new Exception("El nombre no puede quedar vacio.");
            if (vista.Observacion == String.Empty)
                throw new Exception("La observacion no puede quedar vacia.");
            if (vista.PrecioLista == 0)
                throw new Exception("El precio de lista no puede ser 0.");
            if (vista.PrecioDistribuidor == 0)
                throw new Exception("El precio de distribuidor no puede ser 0.");
            if (vista.ProductoSubCategoriaId == 0)
                throw new Exception("Debe elegir una sub categoria para el producto.");
            ProductoSubCategoria productoSubCategoria = RepositorioProductoSubCategoria.DevolverPorId(vista.ProductoSubCategoriaId);
            if (productoSubCategoria == null)
                throw new Exception("La sub categoria de producto no existe.");
            switch (vista.Estado)
            {
                case EnumEstado.NUEVO:
                    {
                        Producto producto = new Producto();
                        producto.Nombre = vista.Nombre;
                        producto.Observacion = vista.Observacion;
                        producto.PrecioLista = vista.PrecioLista;
                        producto.PrecioDistribuidor = vista.PrecioDistribuidor;
                        producto.ProductoSubCategoria = productoSubCategoria;
                        RepositorioProducto.Insertar(producto);
                        break;
                    }
                case EnumEstado.MODIFICAR:
                    {
                        if (vista.ProductoId == (Int32)EnumProductos.PRODUCTO_POR_DEFECTO)
                            throw new Exception("No se puede modificar un producto por defecto.");
                        Producto producto = RepositorioProducto.DevolverPorId(vista.ProductoId);
                        if (producto == null)
                            throw new Exception("El producto no existe.");
                        producto.Nombre = vista.Nombre;
                        producto.Observacion = vista.Observacion;
                        producto.PrecioLista = vista.PrecioLista;
                        producto.PrecioDistribuidor = vista.PrecioDistribuidor;
                        producto.ProductoSubCategoria = productoSubCategoria;
                        RepositorioProducto.Modificar(producto);
                        break;
                    }
            }
            Inicialiar();
        }

        public void Eliminar()
        {
            if (vista.ProductoId == (Int32)EnumProductos.PRODUCTO_POR_DEFECTO)
                throw new Exception("No se puede eliminar un producto por defecto.");
            Producto producto = RepositorioProducto.DevolverPorId(vista.ProductoId);
            if (producto == null)
            {
                Inicialiar();
                throw new Exception("El producto seleccionado no existe.");
            }
            RepositorioProducto.Eliminar(producto);
            Inicialiar();
        }

        public ProductoSubCategoria TraerProductoSubCategoriaPorId(Int32 productoSubCategoriaId)
        {
            ProductoSubCategoria entidad = RepositorioProductoSubCategoria.DevolverPorId(productoSubCategoriaId);
            return entidad;
        }

        #endregion
    }
}
